<!DOCTYPE html>
<html>

<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
	<meta name="theme-color" content="#33474d">
	<title>失落的乐章</title>
	<link rel="stylesheet" href="/css/style.css" />
	
      <link rel="alternate" href="/atom.xml" title="失落的乐章" type="application/atom+xml">
    
</head>

<body>

	<header class="header">
		<nav class="header__nav">
			
				<a href="/archives" class="header__link">Archive</a>
			
				<a href="/tags" class="header__link">Tags</a>
			
				<a href="/atom.xml" class="header__link">RSS</a>
			
		</nav>
		<h1 class="header__title"><a href="/">失落的乐章</a></h1>
		<h2 class="header__subtitle">技术面前，永远都是学生。</h2>
	</header>

	<main>
		
	<span class="different-posts different-posts_earlier">📖 <a href="/page/56">earlier posts</a> 📖</span>




	<article>
	
		<h1><a href="/2017/10/12/1. Linux 基础/69. CentOS 7 下使用iptables/">CentOS 7 下使用iptables</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Linux/">Linux</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;系统升级到CentOS 7后总感觉iptables怪怪的,比如不管怎么保存重启后都被初始化一下,即便我最后发大绝招启动时候加命令:</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;首先iptables-save &gt; /etc/iptables.rules保存当前状态。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@openstack1 ~]<span class="comment"># iptables-save &gt; /etc/iptables.rules</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;然后再在/etc/rc.local中强制加上</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">iptables-restore/etc/iptables.rules</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;重启后虽然规则生效但仔细看规则还是一些被莫名添加的额外的内容，让人很是不爽。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;仔细一google,发现问题之所在了。RedHat在7中更改了系统软件，不再使用iptables作为系统的防火墙，而是使用了FirewallD,但是为了兼容过去的命令也可以使用iptables来设置防护规则，但启动的时候自搞了一套。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;解决方法也很简单:</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;首先，可以考虑follow官方的想法转用FirewallD 。其实查看一些官方文档也能用。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;但是，个人觉得若没有显著的提升也可以继续使用原来的iptables.若打算继续使用iptables,可以继续做如下:</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;备份当前规则</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@openstack1 ~]<span class="comment"># iptables-save &gt; iptables.rules</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;禁用FireWallD,安装&amp;启用iptables-services</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">[root@openstack1 ~]<span class="comment"># systemctl stop firewalld</span></div><div class="line">[root@openstack1 ~]<span class="comment"># systemctl mask firewalld</span></div><div class="line">Created symlink from /etc/systemd/system/firewalld.service to /dev/null.</div><div class="line">[root@openstack1 ~]<span class="comment"># yum install -y iptables-services</span></div><div class="line">[root@openstack1 ~]<span class="comment"># systemctl enable iptables</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;mask是比disable 更强劲的禁用</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;为了让/etc/init.d/iptables save 这条命令生效，需要这么做</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@openstack1 ~]<span class="comment"># cp /usr/libexec/iptables/iptables.init /etc/init.d/iptables</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;而chkconfig iptables 命令会自动重定向到sytemctl enable iptables</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@openstack1 ~]<span class="comment"># chkconfig ipatbles</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这时候检查iptables发现规则被清空了</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">[root@openstack1 ~]<span class="comment"># iptables -nxL</span></div><div class="line">Chain INPUT (policy ACCEPT)</div><div class="line">target   prot   opt   <span class="built_in">source</span>   destination </div><div class="line"></div><div class="line">Chain FORWARD (policy ACCEPT)</div><div class="line">target   prot   opt   <span class="built_in">source</span>   destination </div><div class="line"></div><div class="line">Chain OUTPUT (policy ACCEPT)</div><div class="line">target   prot   opt   <span class="built_in">source</span>   destination</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;将备份的规则还原</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@openstack1 ~]<span class="comment"># iptables-restore iptables.rules</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;保存当前规则</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@openstack1 ~]<span class="comment"># /usr/libexec/iptables/iptables.init save</span></div><div class="line">iptables: Saving firewall rules to /etc/sysconfig/iptables:[ 确定 ]</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;若使用minimize版本的安装，可能会出现提示</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">iptables: Saving firewall rules to /etc/sysconfig/iptables: /etc/init.d/iptables: line 274: restorecon: <span class="built_in">command</span> not found</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这是因为selinux没有安装的缘故，缺少一个组件。安装policycoreutils即可。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@openstack1 ~]<span class="comment"># yum install -y policycoreutils</span></div></pre></td></tr></table></figure>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/1. Linux 基础/7. Linux 密码文件/">Linux 密码文件</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Linux/">Linux</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;密码文件 <code>/etc/shadow</code> 和 ·/etc/passwd·，类似，都是 Linux 系统最重要的文件之一，用 <code>：</code> 分割成9个字段。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># cat /etc/shadow |head -n 3</span></div><div class="line">root:<span class="variable">$6</span><span class="variable">$Wo0kPkgm</span><span class="variable">$OAp0Wl2AsaE4ei4YVbxo3DIU5OBSYxn1y7qxB5Jns70Yk91AvzElsR5GmoGCC8DUXkKzK7vyiV8wXNeaWNm861</span>:15832:0:99999:7:::</div><div class="line">bin:*:15628:0:99999:7:::</div><div class="line">daemon:*:15628:0:99999:7:::</div></pre></td></tr></table></figure>
<h2 id="每个字段的含义"><a href="#每个字段的含义" class="headerlink" title="每个字段的含义"></a>每个字段的含义</h2><h3 id="1-用户名"><a href="#1-用户名" class="headerlink" title="1. 用户名"></a>1. 用户名</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;跟 /etc/passwd 对应。</p>
<h3 id="2-用户密码"><a href="#2-用户密码" class="headerlink" title="2. 用户密码"></a>2. 用户密码</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这个才是该帐号真正的密码，不过这个密码已经加密了，但是还是能够解密的。所以该文件属性设置为000，但是 root 账户是可以访问或更改的。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># ls -l /etc/shadow</span></div><div class="line">---------- 1 root root 719 5月  10 09:02 /etc/shadow</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;root的密码很长，通常以 <code>$6$</code> 开头；<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;“*” 表示账户被 <code>锁定</code><br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;“!!” 账户还没有密码<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;注意：CentOS 的加密方式就是 sha-512。 <code>$6$ 开头是 sha-512 ；$5$ 开头是 sha-256 ；$1$ 表明是用 MD5 加密。</code> </p>
<h3 id="3-上次更改密码的日期"><a href="#3-上次更改密码的日期" class="headerlink" title="3. 上次更改密码的日期"></a>3. 上次更改密码的日期</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这个数字的计算是，距离1970年1月1日到上次更改密码的日期，单位是天。例如上次更改密码的日期为2012年1月1日，则这个值就是 ‘365×(2012-1970)+(2012-1970)÷4+1 = 15341’。因为如果是闰年，则有366天。</p>
<h3 id="4-要过多少天才可以可以更改密码"><a href="#4-要过多少天才可以可以更改密码" class="headerlink" title="4. 要过多少天才可以可以更改密码"></a>4. 要过多少天才可以可以更改密码</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;默认是0，即不限制。</p>
<h3 id="5-密码多少天后到期"><a href="#5-密码多少天后到期" class="headerlink" title="5. 密码多少天后到期"></a>5. 密码多少天后到期</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;即在多少天内必须更改密码，例如这里设置成30，则30天内必须更改一次密码，否则将不能登录系统，默认是99999，可以理解为永远不需要改。</p>
<h3 id="6-密码到期前的警告期限"><a href="#6-密码到期前的警告期限" class="headerlink" title="6. 密码到期前的警告期限"></a>6. 密码到期前的警告期限</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;若这个值设置成7，则表示当7天后密码过期时，系统就发出告警告诉用户，提醒用户他的密码将在7天后到期。</p>
<h3 id="7-帐号失效期限"><a href="#7-帐号失效期限" class="headerlink" title="7. 帐号失效期限"></a>7. 帐号失效期限</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;可以这样理解，如果设置这个值为3，则表示：密码已经到期，然而用户并没有在到期前修改密码，那么再过3天，则这个帐号就失效了，即锁定了。</p>
<h3 id="8-帐号的生命周期"><a href="#8-帐号的生命周期" class="headerlink" title="8. 帐号的生命周期"></a>8. 帐号的生命周期</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;跟第三段一样，是按距离1970年1月1日多少天算的。它表示的含义是，帐号在这个日期前可以使用，到期后帐号作废。</p>
<h3 id="9-作为保留用的"><a href="#9-作为保留用的" class="headerlink" title="9. 作为保留用的"></a>9. 作为保留用的</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;没有什么意义。</p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/1. Linux 基础/68. rsync错误二则、排错过程及解决办法/">rsync错误二则、排错过程及解决办法</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Linux/">Linux</a>
			</span>
		
	</div>

	

	
		<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/rsync%E9%94%99%E8%AF%AF%E4%BA%8C%E5%88%99%E3%80%81%E6%8E%92%E9%94%99%E8%BF%87%E7%A8%8B%E5%8F%8A%E8%A7%A3%E5%86%B3%E5%8A%9E%E6%B3%95/01.png?raw=true" alt=""></figure></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div></pre></td><td class="code"><pre><div class="line"><span class="meta">#!/bin/bash</span></div><div class="line"><span class="comment">#</span></div><div class="line"><span class="comment">#created by zhaopeiwu @ 2015-04-20</span></div><div class="line"><span class="comment">#FOR control the size of error log of apache</span></div><div class="line">PATH=/usr/<span class="built_in">local</span>/sbin:/usr/<span class="built_in">local</span>/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/<span class="built_in">local</span>/apache2/bin:/usr/<span class="built_in">local</span>/mysql/bin</div><div class="line"><span class="built_in">export</span> PATH</div><div class="line"></div><div class="line">log_path=<span class="string">"/usr/local/apache2/logs/"</span></div><div class="line">log_size=`du -s <span class="variable">$log_path</span>/error_log|cut -f 1`</div><div class="line"><span class="keyword">if</span> [ <span class="variable">$log_size</span> -gt 100000 ];</div><div class="line"><span class="keyword">then</span></div><div class="line">    mv <span class="variable">$log_path</span>/error_log <span class="variable">$log_path</span>/error_log_`date +%Y%m%d`;</div><div class="line">    touch <span class="variable">$log_path</span>/error_log;</div><div class="line"><span class="keyword">fi</span></div><div class="line"></div><div class="line">num_del=`ls -t <span class="variable">$log_path</span>/error*|wc -l`</div><div class="line"><span class="keyword">if</span> [ <span class="variable">$num_del</span> -gt 4 ];</div><div class="line"><span class="keyword">then</span></div><div class="line">    ls -t <span class="variable">$log_path</span>/error*|tail -$[<span class="variable">$num_del</span>-2]|xargs -i rm -f &#123;&#125; 2 &gt; /dev/null</div><div class="line"><span class="keyword">fi</span></div><div class="line"></div><div class="line"><span class="built_in">exit</span> 0</div></pre></td></tr></table></figure>
	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/1. Linux 基础/67. Linux系统日志及日志分析/">Linux系统日志及日志分析</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Linux/">Linux</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Linux系统拥有非常灵活和强大的日志功能，可以保存几乎所有的操作记录，并可以从中检索出我们需要的信息。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;大部分Linux发行版默认的日志守护进程为 syslog，位于 /etc/syslog 或 /etc/syslogd，默认配置文件为 /etc/syslog.conf，任何希望生成日志的程序都可以向 syslog 发送信息。 </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Linux系统内核和许多程序会产生各种错误信息、警告信息和其他的提示信息，这些信息对管理员了解系统的运行状态是非常有用的，所以应该把它们写到日志文件中去。完成这个过程的程序就是syslog。syslog可以根据日志的类别和优先级将日志保存到不同的文件中。例如，为了方便查阅，可以把内核信息与其他信息分开，单独保存到一个独立的日志文件中。默认配置下，日志文件通常都保存在“/var/log”目录下。</p>
<h2 id="日志类型"><a href="#日志类型" class="headerlink" title="日志类型"></a>日志类型</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;下面是常见的日志类型，但并不是所有的Linux发行版都包含这些类型：</p>
<table>
<thead>
<tr>
<th>类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>auth</td>
<td>用户认证时产生的日志，如login命令、su命令。</td>
</tr>
<tr>
<td>authpriv</td>
<td>与 auth 类似，但是只能被特定用户查看。</td>
</tr>
<tr>
<td>console</td>
<td>针对系统控制台的消息。</td>
</tr>
<tr>
<td>cron</td>
<td>系统定期执行计划任务时产生的日志。</td>
</tr>
<tr>
<td>daemon</td>
<td>某些守护进程产生的日志。</td>
</tr>
<tr>
<td>ftp</td>
<td>FTP服务。</td>
</tr>
<tr>
<td>kern</td>
<td>系统内核消息。</td>
</tr>
<tr>
<td>local0.local7</td>
<td>由自定义程序使用。</td>
</tr>
<tr>
<td>lpr</td>
<td>与打印机活动有关。</td>
</tr>
<tr>
<td>mail</td>
<td>邮件日志。</td>
</tr>
<tr>
<td>mark</td>
<td>产生时间戳。系统每隔一段时间向日志文件中输出当前时间，每行的格式类似于 May 26 11:17:09 rs2 – MARK –，可以由此推断系统发生故障的大概时间。</td>
</tr>
<tr>
<td>news</td>
<td>网络新闻传输协议(nntp)产生的消息。</td>
</tr>
<tr>
<td>ntp</td>
<td>网络时间协议(ntp)产生的消息。</td>
</tr>
<tr>
<td>user</td>
<td>用户进程。uucpUUCP子系统。</td>
</tr>
</tbody>
</table>
<h2 id="日志优先级"><a href="#日志优先级" class="headerlink" title="日志优先级"></a>日志优先级</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;常见的日志优先级请见下标：</p>
<table>
<thead>
<tr>
<th>优先级</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>emerg</td>
<td>紧急情况，系统不可用（例如系统崩溃），一般会通知所有用户。</td>
</tr>
<tr>
<td>alert</td>
<td>需要立即修复，例如系统数据库损坏。</td>
</tr>
<tr>
<td>crit</td>
<td>危险情况，例如硬盘错误，可能会阻碍程序的部分功能。</td>
</tr>
<tr>
<td>err</td>
<td>一般错误消息。</td>
</tr>
<tr>
<td>warning</td>
<td>警告。</td>
</tr>
<tr>
<td>notice</td>
<td>不是错误，但是可能需要处理。</td>
</tr>
<tr>
<td>info</td>
<td>通用性消息，一般用来提供有用信息。</td>
</tr>
<tr>
<td>debug</td>
<td>调试程序产生的信息。</td>
</tr>
<tr>
<td>none</td>
<td>没有优先级，不记录任何日志消息。</td>
</tr>
</tbody>
</table>
<h2 id="常见日志文件"><a href="#常见日志文件" class="headerlink" title="常见日志文件"></a>常见日志文件</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;所有的系统应用都会在 /var/log 目录下创建日志文件，或创建子目录再创建日志文件。例如：</p>
<table>
<thead>
<tr>
<th>文件/目录</th>
<th>说明/</th>
</tr>
</thead>
<tbody>
<tr>
<td>var/log/boot.log</td>
<td>开启或重启日志。</td>
</tr>
<tr>
<td>/var/log/cron</td>
<td>计划任务日志</td>
</tr>
<tr>
<td>/var/log/maillog</td>
<td>邮件日志。</td>
</tr>
<tr>
<td>/var/log/messages</td>
<td>该日志文件是许多进程日志文件的汇总，从该文件可以看出任何入侵企图或成功的入侵。</td>
</tr>
<tr>
<td>/var/log/httpd 目录</td>
<td>Apache HTTP 服务日志。</td>
</tr>
<tr>
<td>/var/log/samba 目录</td>
<td>samba 软件日志</td>
</tr>
</tbody>
</table>
<h2 id="etc-syslog-conf-文件"><a href="#etc-syslog-conf-文件" class="headerlink" title="/etc/syslog.conf 文件"></a>/etc/syslog.conf 文件</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;/etc/syslog.conf 是 syslog 的配置文件，会根据日志类型和优先级来决定将日志保存到何处。典型的 syslog.conf 文件格式如下所示：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line">*.err;kern.debug;auth.notice /dev/console</div><div class="line">daemon,auth.notice           /var/<span class="built_in">log</span>/messages</div><div class="line">lpr.info                     /var/<span class="built_in">log</span>/lpr.log</div><div class="line">mail.*                       /var/<span class="built_in">log</span>/mail.log</div><div class="line">ftp.*                        /var/<span class="built_in">log</span>/ftp.log</div><div class="line">auth.*                       @see.xidian.edu.cn</div><div class="line">auth.*                       root,amrood</div><div class="line">netinfo.err                  /var/<span class="built_in">log</span>/netinfo.log</div><div class="line">install.*                    /var/<span class="built_in">log</span>/install.log</div><div class="line">*.emerg                      *</div><div class="line">*.alert                      |program_name</div><div class="line">mark.*                       /dev/console</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;第一列为日志类型和日志优先级的组合，每个类型和优先级的组合称为一个选择器；后面一列为保存日志的文件、服务器，或输出日志的终端。syslog 进程根据选择器决定如何操作日志。</p>
<h3 id="对配置文件的几点说明："><a href="#对配置文件的几点说明：" class="headerlink" title="对配置文件的几点说明："></a>对配置文件的几点说明：</h3><ul>
<li>日志类型和优先级由点号(.)分开，例如 kern.debug 表示由内核产生的调试信息。</li>
<li>kern.debug 的优先级大于 debug。</li>
<li>星号(*)表示所有，例如 *.debug 表示所有类型的调试信息，kern.* 表示由内核产生的所有消息。</li>
<li>可以使用逗号(,)分隔多个日志类型，使用分号(;)分隔多个选择器。</li>
</ul>
<h3 id="对日志的操作包括："><a href="#对日志的操作包括：" class="headerlink" title="对日志的操作包括："></a>对日志的操作包括：</h3><ul>
<li>将日志输出到文件，例如 /var/log/maillog 或 /dev/console。</li>
<li>将消息发送给用户，多个用户用逗号(,)分隔，例如 root, amrood。</li>
<li>通过管道将消息发送给用户程序，注意程序要放在管道符(|)后面。</li>
<li>将消息发送给其他主机上的 syslog 进程，这时 /etc/syslog.conf 文件后面一列为以@开头的主机名，例如@see.xidian.edu.cn。</li>
</ul>
<h2 id="logger-命令"><a href="#logger-命令" class="headerlink" title="logger 命令"></a>logger 命令</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;logger 是Shell命令，可以通过该命令使用 syslog 的系统日志模块，还可以从命令行直接向系统日志文件写入一行信息。</p>
<h3 id="logger命令的语法为："><a href="#logger命令的语法为：" class="headerlink" title="logger命令的语法为："></a>logger命令的语法为：</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">logger [-i] [-f filename] [-p priority] [-t tag] [message...]</div></pre></td></tr></table></figure>
<p>每个选项的含义如下：</p>
<table>
<thead>
<tr>
<th>选项</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>-f filename</td>
<td>将 filename 文件的内容作为日志。</td>
</tr>
<tr>
<td>-i</td>
<td>每行都记录 logger 进程的ID。</td>
</tr>
<tr>
<td>-p priority</td>
<td>指定优先级；优先级必须是形如 facility.priority 的完整的选择器，默认优先级为 user.notice。</td>
</tr>
<tr>
<td>-t tag</td>
<td>使用指定的标签标记每一个记录行。</td>
</tr>
<tr>
<td>message</td>
<td>要写入的日志内容，多条日志以空格为分隔；如果没有指定日志内容，并且 -f filename 选项为空，那么会把标准输入作为日志内容。</td>
</tr>
</tbody>
</table>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;例如，将ping命令的结果写入日志：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line">$ ping 192.168.0.1 | logger -it logger_test -p local3.notice&amp;</div><div class="line">$ tail -f /var/<span class="built_in">log</span>/userlog</div><div class="line">Oct 6 12:48:43 kevein logger_test[22484]: PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.</div><div class="line">Oct 6 12:48:43 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=1 ttl=253 time=49.7 ms</div><div class="line">Oct 6 12:48:44 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=2 ttl=253 time=68.4 ms</div><div class="line">Oct 6 12:48:45 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=3 ttl=253 time=315 ms</div><div class="line">Oct 6 12:48:46 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=4 ttl=253 time=279 ms</div><div class="line">Oct 6 12:48:47 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=5 ttl=253 time=347 ms</div><div class="line">Oct 6 12:48:49 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=6 ttl=253 time=701 ms</div><div class="line">Oct 6 12:48:50 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=7 ttl=253 time=591 ms</div><div class="line">Oct 6 12:48:51 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=8 ttl=253 time=592 ms</div><div class="line">Oct 6 12:48:52 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=9 ttl=253 time=611 ms</div><div class="line">Oct 6 12:48:53 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=10 ttl=253 time=931 ms</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ping命令的结果成功输出到 /var/log/userlog 文件。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;命令 logger -it logger_test -p local3.notice 各选项的含义：</p>
<ul>
<li>-i：在每行都记录进程ID；</li>
<li>-t logger_test：每行记录都加上“logger_test”这个标签；</li>
<li>-p local3.notice：设置日志类型和优先级。</li>
</ul>
<h2 id="日志转储"><a href="#日志转储" class="headerlink" title="日志转储"></a>日志转储</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;日志转储也叫日志回卷或日志轮转。Linux中的日志通常增长很快，会占用大量硬盘空间，需要在日志文件达到指定大小时分开存储。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;syslog 只负责接收日志并保存到相应的文件，但不会对日志文件进行管理，因此经常会造成日志文件过大，尤其是WEB服务器，轻易就能超过1G，给检索带来困难。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;大多数Linux发行版使用 logrotate 或 newsyslog 对日志进行管理。logrotate 程序不但可以压缩日志文件，减少存储空间，还可以将日志发送到指定 E-mail，方便管理员及时查看日志。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;例如，规定邮件日志 /var/log/maillog 超过1G时转储，每周一次，那么每隔一周 logrotate 进程就会检查 /var/log/maillog 文件的大小：</p>
<ul>
<li>如果没有超过1G，不进行任何操作。</li>
<li>如果在1G~2G之间，就会创建新文件 /var/log/maillog.1，并将多出的1G日志转移到该文件，以给 /var/log/maillog 文件瘦身。</li>
<li>如果在2G~3G之间，会继续创建新文件 /var/log/maillog.2，并将 /var/log/maillog.1 的内容转移到该文件，将 /var/log/maillog 的内容转移到 /var/log/maillog.1，以保持 /var/log/maillog 文件不超过1G。</li>
</ul>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;可以看到，每次转存都会创建一个新文件（如果不存在），命名格式为日志文件名加一个数字（从1开始自动增长），以保持当前日志文件和转存后的日志文件不超过指定大小。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;logrotate 的主要配置文件是 /etc/logrotate.conf，/etc/logrotate.d 目录是对 /etc/logrotate.conf 的补充，或者说为了不使 /etc/logrotate.conf 过大而设置。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;可以通过 cat 命令查看它的内容：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div></pre></td><td class="code"><pre><div class="line"><span class="variable">$cat</span> /etc/logrotate.conf</div><div class="line"><span class="comment"># see "man logrotate" for details //可以查看帮助文档</span></div><div class="line"><span class="comment"># rotate log files weekly</span></div><div class="line">weekly //设置每周转储一次</div><div class="line"><span class="comment"># keep 4 weeks worth of backlogs</span></div><div class="line">rotate 4 //最多转储4次</div><div class="line"><span class="comment"># create new (empty) log files after rotating old ones</span></div><div class="line">create //当转储后文件不存储时创建它</div><div class="line"><span class="comment"># uncomment this if you want your log files compressed</span></div><div class="line"><span class="comment">#compress //以压缩方式转储</span></div><div class="line"><span class="comment"># RPM packages drop log rotation information into this directory</span></div><div class="line">include /etc/logrotate.d //其他日志文件的转储方式，包含在该目录下</div><div class="line"><span class="comment"># no packages own wtmp -- we'll rotate them here</span></div><div class="line">/var/<span class="built_in">log</span>/wtmp &#123; //设置/var/<span class="built_in">log</span>/wtmp日志文件的转储参数</div><div class="line"> monthly //每月转储</div><div class="line"> create 0664 root utmp //转储后文件不存在时创建它，文件所有者为root，所属组为utmp，对应的权限为0664</div><div class="line"> rotate 1 //最多转储一次</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;注意：include 允许管理员把多个分散的文件集中到一个，类似于C语言的 #include，将其他文件的内容包含进当前文件。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;include 非常有用，一些程序会把转储日志的配置文件放在 /etc/logrotate.d 目录，这些配置文件会覆盖或增加 /etc/logrotate.conf 的配置项，如果没有指定相关配置，那么采用 /etc/logrotate.conf 的默认配置。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;所以，建议将 /etc/logrotate.conf 作为默认配置文件，第三方程序在 /etc/logrotate.d 目录下自定义配置文件。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;logrotate 也可以作为命令直接运行来修改配置文件。</p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/1. Linux 基础/66. Linux日志文件总管-logrotate/">Linux日志总管-logrotate</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Linux/">Linux</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;日志文件包含了关于系统中发生的事件的有用信息，在排障过程中或者系统性能分析时经常被用到。对于忙碌的服务器，日志文件大小会增长极快，服务器会很快消耗磁盘空间，这成了个问题。除此之外，处理一个单个的庞大日志文件也常常是件十分棘手的事。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;logrotate是个十分有用的工具，它可以自动对日志进行截断（或轮循）、压缩以及删除旧的日志文件。例如，可以设置logrotate，让/var/log/foo日志文件每30天轮循，并删除超过6个月的日志。配置完后，logrotate的运作完全自动化，不必进行任何进一步的人为干预。另外，旧日志也可以通过电子邮件发送。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;主流Linux发行版上都默认安装有logrotate包，如果出于某种原因，logrotate没有出现在里头，可以使用apt-get或yum命令来安装。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在Debian或Ubuntu上：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># apt-get install logrotate cron</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在Fedora，CentOS或RHEL上：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># yum install logrotate crontabs</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;logrotate的配置文件是/etc/logrotate.conf，通常不需要对它进行修改。日志文件的轮循设置在独立的配置文件中，它（们）放在/etc/logrotate.d/目录下。</p>
<h2 id="样例一"><a href="#样例一" class="headerlink" title="样例一"></a>样例一</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在第一个样例中，我们将创建一个10MB的日志文件/var/log/log-file。我们将展示怎样使用logrotate来管理该日志文件。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;从创建一个日志文件开始，然后在其中填入一个10MB的随机比特流数据。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># touch /var/log/log-file</span></div><div class="line"><span class="comment"># head -c 10M &lt; /dev/urandom &gt; /var/log/log-file</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;由于现在日志文件已经准备好，将配置logrotate来轮循该日志文件。让我们为该文件创建一个配置文件。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># vim /etc/logrotate.d/log-file</span></div><div class="line"></div><div class="line">/var/<span class="built_in">log</span>/<span class="built_in">log</span>-file &#123;</div><div class="line"> monthly</div><div class="line"> rotate 5</div><div class="line"> compress</div><div class="line"> delaycompress</div><div class="line"> missingok</div><div class="line"> notifempty</div><div class="line"> create 644 root root</div><div class="line"> postrotate</div><div class="line"> /usr/bin/killall -HUP rsyslogd</div><div class="line"> endscript</div><div class="line"> &#125;</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>说明</strong></p>
<ul>
<li><strong>monthly</strong> : 日志文件将按月轮循。其它可用值为‘daily’，‘weekly’或者‘yearly’。</li>
<li><strong>rotate 5</strong> : 一次将存储5个归档日志。对于第六个归档，时间最久的归档将被删除。</li>
<li><strong>compress</strong> : 在轮循任务完成后，已轮循的归档将使用gzip进行压缩。</li>
<li><strong>delaycompress</strong> : 总是与compress选项一起用，delaycompress选项指示logrotate不要将最近的归档压缩，压缩将在下一次轮循周期进行。这在你或任何软件仍然需要读取最新归档时很有用。</li>
<li><strong>missingok</strong> : 在日志轮循期间，任何错误将被忽略，例如“文件无法找到”之类的错误。</li>
<li><strong>notifempty</strong> : 如果日志文件为空，轮循不会进行。</li>
<li><strong>create 644 root root</strong> : 以指定的权限创建全新的日志文件，同时logrotate也会重命名原始日志文件。</li>
<li><strong>postrotate/endscript</strong> : 在所有其它指令完成后，postrotate和endscript里面指定的命令将被执行。在这种情况下，rsyslogd 进程将立即再次读取其配置并继续运行。</li>
</ul>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;上面的模板是通用的，而配置参数则根据需求进行调整，不是所有的参数都是必要的。</p>
<h2 id="样例二"><a href="#样例二" class="headerlink" title="样例二"></a>样例二</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在本例中，只想要轮循一个日志文件，然而日志文件大小可以增长到50MB。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># vim /etc/logrotate.d/log-file</span></div><div class="line"></div><div class="line">/var/<span class="built_in">log</span>/<span class="built_in">log</span>-file &#123;</div><div class="line"> size=50M</div><div class="line"> rotate 5</div><div class="line"> create 644 root root</div><div class="line"> postrotate</div><div class="line"> /usr/bin/killall -HUP rsyslogd</div><div class="line"> endscript</div><div class="line"> &#125;</div></pre></td></tr></table></figure>
<h2 id="样例三"><a href="#样例三" class="headerlink" title="样例三"></a>样例三</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;想要让旧日志文件以创建日期命名，这可以通过添加dateext常熟实现。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># vim /etc/logrotate.d/log-file</span></div><div class="line"></div><div class="line">/var/<span class="built_in">log</span>/<span class="built_in">log</span>-file &#123;</div><div class="line"> monthly</div><div class="line"> rotate 5</div><div class="line"> dateext</div><div class="line"> create 644 root root</div><div class="line"> postrotate</div><div class="line"> /usr/bin/killall -HUP rsyslogd</div><div class="line"> endscript</div><div class="line"> &#125;</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这将让归档文件在它们的文件名中包含日期信息。</p>
<h2 id="排障"><a href="#排障" class="headerlink" title="排障"></a>排障</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这里提供了一些logrotate设置的排障提示。</p>
<h3 id="1-手动运行logrotate"><a href="#1-手动运行logrotate" class="headerlink" title="1. 手动运行logrotate"></a>1. 手动运行logrotate</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>logrotate</strong> 可以在任何时候从命令行手动调用。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;要调用为/etc/lograte.d/下配置的所有日志调用 <strong>logrotate</strong> ：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># logrotate /etc/logrotate.conf</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;要为某个特定的配置调用logrotate：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># logrotate /etc/logrotate.d/log-file</span></div></pre></td></tr></table></figure>
<h3 id="2-演练"><a href="#2-演练" class="headerlink" title="2. 演练"></a>2. 演练</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;排障过程中的最佳选择是使用‘-d’选项以预演方式运行logrotate。要进行验证，不用实际轮循任何日志文件，可以模拟演练日志轮循并显示其输出。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># logrotate -d /etc/logrotate.d/log-file</span></div></pre></td></tr></table></figure>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/linux%E6%97%A5%E5%BF%97%E6%96%87%E4%BB%B6%E6%80%BB%E7%AE%A1-logrotate/01.jpeg?raw=true" alt=""></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;正如从上面的输出结果可以看到的，logrotate判断该轮循是不必要的。如果文件的时间小于一天，这就会发生了。</p>
<h3 id="3-强制轮循"><a href="#3-强制轮循" class="headerlink" title="3. 强制轮循"></a>3. 强制轮循</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;即使轮循条件没有满足，我们也可以通过使用‘-f’选项来强制logrotate轮循日志文件，‘-v’参数提供了详细的输出。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># logrotate -vf /etc/logrotate.d/log-file</span></div><div class="line"></div><div class="line">reading config file /etc/logrotate.d/<span class="built_in">log</span>-file</div><div class="line"> reading config info <span class="keyword">for</span> /var/<span class="built_in">log</span>/<span class="built_in">log</span>-file</div><div class="line">  </div><div class="line"> Handling 1 logs</div><div class="line">  </div><div class="line"> rotating pattern: /var/<span class="built_in">log</span>/<span class="built_in">log</span>-file forced from <span class="built_in">command</span> line (5 rotations)</div><div class="line"> empty <span class="built_in">log</span> files are rotated, old logs are removed</div><div class="line"> considering <span class="built_in">log</span> /var/<span class="built_in">log</span>/<span class="built_in">log</span>-file</div><div class="line"> <span class="built_in">log</span> needs rotating</div><div class="line"> rotating <span class="built_in">log</span> /var/<span class="built_in">log</span>/<span class="built_in">log</span>-file, <span class="built_in">log</span>-&gt;rotateCount is 5</div><div class="line"> dateext suffix <span class="string">'-20140916'</span></div><div class="line"> glob pattern <span class="string">'-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'</span></div><div class="line"> renaming /var/<span class="built_in">log</span>/<span class="built_in">log</span>-file.5.gz to /var/<span class="built_in">log</span>/<span class="built_in">log</span>-file.6.gz (rotatecount 5, logstart 1, i 5),</div><div class="line"> old <span class="built_in">log</span> /var/<span class="built_in">log</span>/<span class="built_in">log</span>-file.5.gz does not exist</div><div class="line"> renaming /var/<span class="built_in">log</span>/<span class="built_in">log</span>-file.4.gz to /var/<span class="built_in">log</span>/<span class="built_in">log</span>-file.5.gz (rotatecount 5, logstart 1, i 4),</div><div class="line"> old <span class="built_in">log</span> /var/<span class="built_in">log</span>/<span class="built_in">log</span>-file.4.gz does not exist</div><div class="line"> . . .</div><div class="line"> renaming /var/<span class="built_in">log</span>/<span class="built_in">log</span>-file.0.gz to /var/<span class="built_in">log</span>/<span class="built_in">log</span>-file.1.gz (rotatecount 5, logstart 1, i 0),</div><div class="line"> old <span class="built_in">log</span> /var/<span class="built_in">log</span>/<span class="built_in">log</span>-file.0.gz does not exist</div><div class="line"> <span class="built_in">log</span> /var/<span class="built_in">log</span>/<span class="built_in">log</span>-file.6.gz doesn<span class="string">'t exist -- won'</span>t try to dispose of it</div><div class="line"> renaming /var/<span class="built_in">log</span>/<span class="built_in">log</span>-file to /var/<span class="built_in">log</span>/<span class="built_in">log</span>-file.1</div><div class="line"> creating new /var/<span class="built_in">log</span>/<span class="built_in">log</span>-file mode = 0644 uid = 0 gid = 0</div><div class="line"> running postrotate script</div><div class="line"> compressing <span class="built_in">log</span> with: /bin/gzip</div></pre></td></tr></table></figure>
<h3 id="4-Logrotate的记录日志"><a href="#4-Logrotate的记录日志" class="headerlink" title="4. Logrotate的记录日志"></a>4. Logrotate的记录日志</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;logrotate自身的日志通常存放于/var/lib/logrotate/status目录。如果处于排障目的，我们想要logrotate记录到任何指定的文件，我们可以指定像下面这样从命令行指定。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># logrotate -vf –s /var/log/logrotate-status /etc/logrotate.d/log-file</span></div></pre></td></tr></table></figure>
<h3 id="5-Logrotate定时任务"><a href="#5-Logrotate定时任务" class="headerlink" title="5. Logrotate定时任务"></a>5. Logrotate定时任务</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;logrotate需要的cron任务应该在安装时就自动创建了，我把cron文件的内容贴出来，以供大家参考。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># cat /etc/cron.daily/logrotate</span></div><div class="line"></div><div class="line"><span class="meta">#!/bin/sh</span></div><div class="line"> </div><div class="line"> <span class="comment"># Clean non existent log file entries from status file</span></div><div class="line"> <span class="built_in">cd</span> /var/lib/logrotate</div><div class="line"> <span class="built_in">test</span> -e status || touch status</div><div class="line"> head -1 status &gt; status.clean</div><div class="line"> sed <span class="string">'s/"//g'</span> status | <span class="keyword">while</span> <span class="built_in">read</span> logfile date</div><div class="line"> <span class="keyword">do</span></div><div class="line"> [ -e <span class="string">"<span class="variable">$logfile</span>"</span> ] &amp;&amp; <span class="built_in">echo</span> <span class="string">"\"<span class="variable">$logfile</span>\" <span class="variable">$date</span>"</span></div><div class="line"> <span class="keyword">done</span> &gt;&gt; status.clean</div><div class="line"> mv status.clean status</div><div class="line">  </div><div class="line"> <span class="built_in">test</span> -x /usr/sbin/logrotate || <span class="built_in">exit</span> 0</div><div class="line"> /usr/sbin/logrotate /etc/logrotate.conf</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;小结一下，logrotate工具对于防止因庞大的日志文件而耗尽存储空间是十分有用的。配置完毕后，进程是全自动的，可以长时间在不需要人为干预下运行。本教程重点关注几个使用logrotate的几个基本样例，你也可以定制它以满足你的需求。</p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/1. Linux 基础/65. Linux系统日志/">Linux系统日志</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Linux/">Linux</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;日志重要吗？必须的，没有日志我们怎么知道系统状况？没有日志如何排查一个trouble？日志记录了系统每天发生的各种各样的事情，你可以通过他来检查错误发生的原因，或者受到攻击时攻击者留下的痕迹。日志主要的功能有：审计和监测，还可以实时的监测系统状态，监测和追踪侵入者等等。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;配置文件 <code>/etc/rsyslog.conf</code>  。CentOS默认改为 <code>rsyslog.conf</code> 之前版本是 <code>syslog.conf</code> 。该配置文件主要信息为：记录哪些服务和需要记录什么等级的信息。</p>
<h2 id="日志格式："><a href="#日志格式：" class="headerlink" title="日志格式："></a>日志格式：</h2><ul>
<li><p>auth            -pam生产的日志          </p>
</li>
<li><p>authpriv       -ssh，ftp 等登录信息的验证信息       </p>
</li>
<li><p>cron             -时间任务相关</p>
</li>
<li><p>kern             -内核</p>
</li>
<li><p>lpr                -打印</p>
</li>
<li><p>mail              -邮件</p>
</li>
<li><p>mark(syslog) -rsyslog服务内部的信息，时间标识</p>
</li>
<li><p>news             -新闻组</p>
</li>
<li><p>user              -用户程序产生的相关信息</p>
</li>
<li><p>uucp             -unix to unix copy，unix主机之间相关的通讯</p>
</li>
<li><p>local 1~7       -自定义的日志设备</p>
</li>
</ul>
<h2 id="日志级别："><a href="#日志级别：" class="headerlink" title="日志级别："></a>日志级别：</h2><ul>
<li><p>debug            -有调试信息的，日志信息最多  </p>
</li>
<li><p>info                -一般信息的日志，最常用</p>
</li>
<li><p>notice             -最具有重要性的普通条件的信息</p>
</li>
<li><p>warning           -警告级别</p>
</li>
<li><p>err                   -错误级别，阻止某个功能或者模块不能正常工作的信息</p>
</li>
<li><p>crit                   -严重级别，阻止整个系统或者整个软件不能正常工作的信息</p>
</li>
<li><p>alert                 -需要立刻修改的信息</p>
</li>
<li><p>emerg               -内核崩溃严重信息</p>
</li>
<li><p>none                  -什么都不记录</p>
</li>
</ul>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;从上到下，级别从低到高，记录的信息越来越少</p>
<h2 id="连接符号："><a href="#连接符号：" class="headerlink" title="连接符号："></a>连接符号：</h2><ul>
<li><p><code>.:</code>    表示大于等于xxx 级别的信息</p>
</li>
<li><p><code>.=:</code>  表示等于xxx 级别的信息</p>
</li>
<li><p><code>.!:</code>   表示在xxx 之外的等级的信息</p>
</li>
</ul>
<h2 id="var-log-messages-核心系统日志文件"><a href="#var-log-messages-核心系统日志文件" class="headerlink" title="/var/log/messages 核心系统日志文件"></a>/var/log/messages 核心系统日志文件</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这个日志是linux 系统最核心的日志文件，假若某个服务没有定义日志，那么该服务产生的日志就会到这个文件中。该日志每周归档一次。它是核心系统日志文件，包含了系统启动时的引导消息，以及系统运行时的其他状态消息。IO错误、网络错误和其他系统错误都会记录到这个文件中。另外其他信息，比如某个人的身份切换为root以及用户自定义安装的软件（apache）的日志也会在这里列出。通常，/var/log/messages是在做故障诊断时首先要查看的文件。系统有一个日志轮询的机制，每星期切换一个日志，变成message.xxxxxxxx, message.xxxxxxxx, … messages.xxxxxxxx 连同messages一共有5个这样的日志文件。这里的xxxxxxxx就是按照日期的格式生成的文件，在CentOS5里，这个后缀并不是日期而是数字1,2,3,4. 这是通过logrotate工具的控制来实现的</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># ls /var/log/messages*</span></div><div class="line">/var/<span class="built_in">log</span>/messages /var/<span class="built_in">log</span>/messages-20161016.1 /var/<span class="built_in">log</span>/messages-20161120</div><div class="line">/var/<span class="built_in">log</span>/messages-20161010.1 /var/<span class="built_in">log</span>/messages-20161016.bak /var/<span class="built_in">log</span>/messages-20161129</div><div class="line">/var/<span class="built_in">log</span>/messages-20161010.bak /var/<span class="built_in">log</span>/messages-20161114 /var/<span class="built_in">log</span>/messages-20161204</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;它的配置文件是/etc/logrotate.conf如果没有特殊需求请不要修改这个配置文件。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># cat /etc/logrotate.conf</span></div><div class="line"><span class="comment"># see "man logrotate" for details</span></div><div class="line"><span class="comment"># rotate log files weekly</span></div><div class="line">weekly</div><div class="line"> </div><div class="line"><span class="comment"># keep 4 weeks worth of backlogs</span></div><div class="line">rotate 4</div><div class="line"> </div><div class="line"><span class="comment"># create new (empty) log files after rotating old ones</span></div><div class="line">create</div><div class="line"> </div><div class="line"><span class="comment"># use date as a suffix of the rotated file</span></div><div class="line">dateext</div><div class="line"> </div><div class="line"><span class="comment"># uncomment this if you want your log files compressed</span></div><div class="line"><span class="comment">#compress</span></div><div class="line"> </div><div class="line"><span class="comment"># RPM packages drop log rotation information into this directory</span></div><div class="line">include /etc/logrotate.d</div><div class="line"> </div><div class="line"><span class="comment"># no packages own wtmp and btmp -- we'll rotate them here</span></div><div class="line">/var/<span class="built_in">log</span>/wtmp &#123;</div><div class="line"> monthly</div><div class="line"> create 0664 root utmp</div><div class="line"> minsize 1M</div><div class="line"> rotate 1</div><div class="line">&#125;</div><div class="line"> </div><div class="line">/var/<span class="built_in">log</span>/btmp &#123;</div><div class="line"> missingok</div><div class="line"> monthly</div><div class="line"> create 0600 root utmp</div><div class="line"> rotate 1</div><div class="line">&#125;</div><div class="line"> </div><div class="line"><span class="comment"># system-specific logs may be also be configured here.</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;/var/log/messages是由syslogd这个守护进程产生的，如果停掉这个服务则系统不会产生/var/log/messages，所以这个服务不要停。Syslogd服务的配置文件为/etc/syslog.conf这个文件定义了日志的级别，若没有特殊需求是不需要修改这个配置文件的，使用 <code>man syslog.conf</code> 获得更多关于它的信息。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;除了关注/var/log/messages外，还应该多关注一下 dmesg 这个命令，它可以显示系统的启动信息，如果某个硬件有问题（比如说网卡）用这个命令也是可以看到的。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># dmesg |less</span></div><div class="line">Initializing cgroup subsys cpuset</div><div class="line">Initializing cgroup subsys cpu</div><div class="line">Linux version 2.6.32-220.el6.x86_64 (mockbuild@c6b18n3.bsys.dev.centos.org)</div><div class="line">(gcc version 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC) ) <span class="comment">#1 SMP Tue Dec 6</span></div><div class="line">19:48:22 GMT 2011</div><div class="line">Command line: ro root=UUID=7912412b-3e66-401d-9ef5-3c2aba8dc737 rd_NO_LUKS</div><div class="line">KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD quiet rhgb crashkernel=auto</div><div class="line">LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM</div><div class="line">KERNEL supported cpus:</div><div class="line">  Intel GenuineIntel</div><div class="line">  AMD AuthenticAMD</div><div class="line">  Centaur CentaurHauls</div><div class="line">BIOS-provided physical RAM map:</div><div class="line">BIOS-e820: 0000000000000000 - 000000000009a400 (usable)</div><div class="line">BIOS-e820: 000000000009a400 - 00000000000a0000 (reserved)</div><div class="line">BIOS-e820: 00000000000d2000 - 00000000000d4000 (reserved)</div><div class="line">BIOS-e820: 00000000000e4000 - 0000000000100000 (reserved)</div><div class="line">BIOS-e820: 0000000000100000 - 00000000cff60000 (usable)</div><div class="line">BIOS-e820: 00000000cff60000 - 00000000cff69000 (ACPI data)</div></pre></td></tr></table></figure>
<h2 id="命令：last"><a href="#命令：last" class="headerlink" title="命令：last"></a>命令：last</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># last |head</span></div><div class="line">root pts/0 192.168.0.207 Wed Jun 12 20:28 still logged <span class="keyword">in</span></div><div class="line">root pts/1 192.168.0.207 Wed Jun 12 20:27 still logged <span class="keyword">in</span></div><div class="line">root pts/0 192.168.0.161 Wed Jun 12 14:36 - 20:27 (05:50)</div><div class="line">root pts/0 192.168.0.161 Wed Jun 12 14:36 - 14:36 (00:00)</div><div class="line">root pts/0 192.168.0.207 Wed Jun 12 11:42 - 14:36 (02:54)</div><div class="line">root pts/0 192.168.0.207 Mon Jun 10 12:23 - 14:23 (02:00)</div><div class="line">root pts/0 192.168.0.70 Sat Jun 8 16:43 - 17:53 (01:09)</div><div class="line">root pts/0 192.168.0.70 Fri Jun 7 16:43 - 17:27 (00:44)</div><div class="line">root pts/0 192.168.0.70 Fri Jun 7 09:57 - 16:09 (06:11)</div><div class="line">root pts/0 192.168.0.70 Thu Jun 6 13:40 - 17:50 (04:09)</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;last命令用来查看登录Linux历史信息，从左至右依次为账户名称、登录终端、登录客户端ip、登录日期及时长。last命令输出的信息实际上是读取了二进制日志文件/var/log/wtmp, 只是这个文件不能直接使用cat, vim, head, tail等工具查看。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;另外一个和登陆信息有关的日志文件为/var/log/secure, 该日志文件记录验证和授权等方面的信息，比如ssh登陆系统成功或者失败，都会把相关信息记录在这个日志里。</p>
<ul>
<li><p>/var/log/wtmp日志用来查看用户登录历史，但这个文件不能直接cat查看，只能用last命令查看。</p>
</li>
<li><p>/var/log/btmp日志和wtmp类似，也不能直接cat查看，用命令lastb查看，记录无效登录历史。</p>
</li>
<li><p>/var/log/maillog是用来记录邮件相关的信息，比如发给谁邮件，是否发出去等信息。</p>
</li>
<li><p>/var/log/secure是一个安全认证相关的日志，比如系统用户登录时，正常登录或者登录失败都会记录，另外ftp服务相关的登录日志也会记录到这里来。</p>
</li>
</ul>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;dmesg这是一个命令，主要查看系统实时的硬件设备抛出的信息，如果磁盘异常或者网络异常或者内核异常都会记录下来。只不过这些信息是存到内存里的，系统重启后就消失了。</p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/1. Linux 基础/64. 使用xinetd管理网络应用服务/">使用xinetd管理网络应用服务</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Linux/">Linux</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;默认机器没有安装这个服务，需要安装</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">yum install -y xinetd</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;随着互联网的不断发展以及Linux系统的不断完善，以Linux为系统核心的网络服务器的比重正在逐年上升。从WWW服务器到目前流行的游戏服务器，绝大多数都在采用Linux作为服务平台。正是由于各种应用的不断出现和用户群的增长，基于Linux的系统应当拥有完善的安全措施，应当足够坚固、能够抵抗来自Internet的侵袭，这也正是Linux之所以流行并且成为Internet骨干力量的主要原因。一方面，Linux为用户提供了多种优质的网络服务，包括Http、Ftp、Smtp、Pop3等；另一方面，服务的增多意味着更多的风险。每种服务本身都必然存在着某些缺陷，而这些缺陷很有可能被高明的黑客利用来对系统进行攻击。所以，提供特定服务的服务器应该尽可能开放提供服务必不可少的端口，而将与服务器服务无关的服务关闭，比如：一台作为www和ftp服务器的机器，应该只开放80和25端口，而将其他无关的服务如关掉，以减少系统漏洞。本专题将着重讲述在Linux系统中如何使用xinetd机制来管理网络应用服务。</p>
<h2 id="Xinetd机制介绍"><a href="#Xinetd机制介绍" class="headerlink" title="Xinetd机制介绍"></a>Xinetd机制介绍</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在Linux系统的早期版本中，有一种称为inetd的网络服务管理程序，也叫作“超级服务器”，就是监视一些网络请求的守护进程，其根据网络请求来调用相应的服务进程来处理连接请求。inetd.conf则是inetd的配置文件。inetd.conf文件告诉inetd监听哪些网络端口，为每个端口启动哪个服务。在任何的网络环境中使用Linux系统，第一件要做的事就是了解一下服务器到底要提供哪些服务。不需要的那些服务应该被禁止掉，这样黑客就少了一些攻击系统的机会，因为服务越多，意味着遭受攻击的风险越打。用户可以查看“/etc/inetd.conf”文件，了解一下inetd提供和开放了哪些服务，以根据实际情况进行相应的处理。而在Linux7.X的版本当中则使用xinetd（扩展的超级服务器）的概念对inetd进行了扩展和替代。因此本专题主要以xinetd为背景，来讲述如何增加和删除网络服务，从而有效地保证Linux系统安全。<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;xinetd的默认配置文件是/etc/xinetd.conf。其语法和/etc/inetd.conf完全不同且不兼容。它本质上是/etc/inetd.conf和/etc/hosts.allow，/etc/hosts.deny功能的组合。<br>系统默认使用xinetd的服务可以分为如下几类：</p>
<ul>
<li>标准internet服务：http、telnet、ftp等；</li>
<li>信息服务：finger、netstat、systat；</li>
<li>邮件服务：imap、pop3、smtp；</li>
<li>RPC服务：rquotad 、rstatd、rusersd、sprayd、walld；</li>
<li>BSD服务：comsat、exec、login、ntalk、shell talk；</li>
<li>内部服务：chargen、daytime、echo等；</li>
<li>安全服务：irc；</li>
<li>其他服务：name、tftp、uucp、wu-ftp；</li>
</ul>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;上述xinetd提供的服务的用途以及使用方法，用户可以查找相关的资料获得，这里不再赘述。然而，对他们有详细地了解是必不可少的，这可以帮助用户较好地确定需要或者不需要哪些网络服务功能。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;下面是一个典型的/etc/xinetd.conf文件的例子：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># vi xinetd.conf</span></div><div class="line"><span class="comment">#</span></div><div class="line"><span class="comment"># Simple configuration file for xinetd</span></div><div class="line"><span class="comment">#</span></div><div class="line"><span class="comment"># Some defaults, and include /etc/xinetd.d/</span></div><div class="line">defaults</div><div class="line">&#123;</div><div class="line"> instances = 60</div><div class="line"> log_type = SYSLOG authpriv</div><div class="line"> log_on_success = HOST PID</div><div class="line"> log_on_failure = HOST</div><div class="line"> cps = 25 30</div><div class="line">&#125;</div><div class="line">includedir /etc/xinetd.d</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;从文件最后一行可以清楚地看到，/etc/xinetd.d目录是存放各项网络服务（包括http、ftp等）的核心目录，因而系统管理员需要对其中的配置文件进行熟悉和了解。<br>一般说来，在/etc/xinetd.d的各个网络服务配置文件中，每一项具有下列形式：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div></pre></td><td class="code"><pre><div class="line">service service-name</div><div class="line">&#123;</div><div class="line">Disabled //表明是否禁用该服务</div><div class="line">Flags //可重用标志</div><div class="line">Socket_type //TCP/IP数据流的类型，包括stream，datagram，raw等</div><div class="line">Wait //是否阻塞服务，即单线程或多线程</div><div class="line">User //服务进程的uid</div><div class="line">Server //服务器守护进程的完整路径</div><div class="line">log_on_failure //登陆错误日志记录</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;其中service是必需的关键字，且属性表必须用大括号括起来。每一项都定义了由service-name定义的服务。<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Service-name是任意的，但通常是标准网络服务名，也可增加其他非标准的服务，只要它们能通过网络请求激活，包括localhost自身发出的网络请求。<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;每一个service有很多可以使用的attribute，操作符可以是=，+=，或-=。所有属性可以使用=，其作用是分配一个或多个值，某些属性可以使用+=或－=的形式，其作用分别是将其值增加到某个现存的值表中，或将其值从现存值表中删除。<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;用户应该特别注意的是：每一项用户想新添加的网络服务描述既可以追加到现有的/etc/xinetd.conf中，也可以在/etc/xinetd.conf中指定的目录中分别建立单独的文件，RedHat 7.x以上的版本都建议采用后一种做法，因为这样做的可扩充性很好，管理起来也比较方便，用户只需要添加相应服务的描述信息即可追加新的网络服务。<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;RedHat 7.x默认的服务配置文件目录是/etc/xinetd.d，在该目录中使用如下命令可以看到许多系统提供的服务：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div></pre></td><td class="code"><pre><div class="line"><span class="comment">#cd /etc/xinetd.d</span></div><div class="line"><span class="comment">#ls</span></div><div class="line">chargen cvspserver daytime-udp <span class="built_in">echo</span>-udp ntalk qmail-pop3 rexec rsh sgi_fam telnet time-udp chargen-udp daytime <span class="built_in">echo</span> finger pop3 qmail-smtp rlogin rsync talk time wu-ftpd</div><div class="line">然而，上述的许多服务，默认都是关闭的，看看如下文件内容：</div><div class="line"><span class="comment">#cat telnet</span></div><div class="line"><span class="comment"># default: off //表明默认该服务是关闭的</span></div><div class="line"><span class="comment"># description: The telnet server serves telnet sessions; it uses \</span></div><div class="line"><span class="comment"># unencrypted username/password pairs for authentication.</span></div><div class="line">service telnet</div><div class="line">&#123;</div><div class="line"> <span class="built_in">disable</span> = yes //表明默认该服务是关闭的</div><div class="line"> flags = REUSE</div><div class="line"> socket_type = stream </div><div class="line"> <span class="built_in">wait</span> = no</div><div class="line"> user = root</div><div class="line"> server = /usr/sbin/in.telnetd</div><div class="line"> log_on_failure += USERID</div></pre></td></tr></table></figure>
<h2 id="服务的开启与关闭"><a href="#服务的开启与关闭" class="headerlink" title="服务的开启与关闭"></a>服务的开启与关闭</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;一般说来，用户可以使用两种办法来对网络服务进行开启与关闭。一种为通过文件直接编写进行开启与关闭；另外一种则通过用户熟悉的图形用户界面进行。下面分别进行介绍。</p>
<h3 id="1-使用-etc-xinetd-d目录下的文件进行配置"><a href="#1-使用-etc-xinetd-d目录下的文件进行配置" class="headerlink" title="1.使用/etc/xinetd.d目录下的文件进行配置"></a>1.使用/etc/xinetd.d目录下的文件进行配置</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;针对上面列出的关于telnet的例子，用户想要开启服务，只需要通过使用vi 编辑器改写该文件为如下内容：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div></pre></td><td class="code"><pre><div class="line">service telnet</div><div class="line">&#123;</div><div class="line"> <span class="built_in">disable</span> = no //将该域置为“no”，则表明开启该服务</div><div class="line"> flags = REUSE</div><div class="line"> socket_type = stream </div><div class="line"> <span class="built_in">wait</span> = no</div><div class="line"> user = root</div><div class="line"> server = /usr/sbin/in.telnetd</div><div class="line"> log_on_failure += USERID</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;然后，需要使用/etc/rc.d/init.d/xinetd restart来激活Telnet服务即可。<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;相对应的，如果用户想要关闭某个不需要的服务，则将上述的disable = no改为disable = yes即可，这样就修改了服务配置，并且再次使用/etc/rc.d/init.d/xinetd restart来启用最新的配置。<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这种方法使用起来相对于Windows下的图形配置方法较为复杂，用户需要对其中的每个参数都有清楚地了解，不能够随意修改，所以建议高级用户或者是有经验的用户使用。</p>
<h3 id="2-使用图形用户界面进行配置："><a href="#2-使用图形用户界面进行配置：" class="headerlink" title="2.使用图形用户界面进行配置："></a>2.使用图形用户界面进行配置：</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;用户可以在终端下键入“setup”命令来对系统提供的服务、防火墙配置、用户授权配置、网络配置、声卡配置、打印机配置等进行全方位的配置。<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;用户选择其中的System services进行配置即可.<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;用户将会看到系统罗列出了anacron,apmd,autofs,chargen,telnet,http等包括我们上面所讲述的xinetd管理的网络服务在内的系统服务进程，用户通过选择这些进程，则可以开启相应的服务。而如果用户想关掉其中的某个服务，则取消选择，保存退出即可以完成配置。<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;而用户这样设置的结果，就相当于直接对/etc/xinetd.d相应网络服务的配置文件进行了改写，只不过使用起来更加直观和方便，且不需要用户具有比较熟练的Linux使用技巧。<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;同样需要注意的是，在配置好了相应的网络服务之后，需要执行/etc/rc.d/init.d/xinetd restart命令来对新的改动进行激活，那么就能够使用最新配置的服务了。<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;最后强调用户注意的是，本文给出的使用方法使用效率的高低、正确与否，极大程度上取决于具体的应用，以及用户对各项服务理解程度的不同。希望用户在配置自己的Linux服务器之前，对各种应用服务都作深入地了解，待到根据实际的应用需求确定好需要开启和哪些网络服务之后再使用xinetd机制进行配置，切忌稀里糊涂地进行配置，反而导致产生较大的漏洞和风险。</p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/1. Linux 基础/63. rc.local自启动学习/">rc.local自启动学习</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Linux/">Linux</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;linux有自己一套完整的启动体系，抓住了linux启动的脉络，linux的启动过程将不再神秘。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;本文中假设inittab中设置的init tree为：</p>
<ul>
<li>/etc/rc.d/rc0.d</li>
<li>/etc/rc.d/rc1.d</li>
<li>/etc/rc.d/rc2.d</li>
<li>/etc/rc.d/rc3.d</li>
<li>/etc/rc.d/rc4.d</li>
<li>/etc/rc.d/rc5.d</li>
<li>/etc/rc.d/rc6.d</li>
<li>/etc/rc.d/init.d</li>
</ul>
<h2 id="1-关于linux的启动"><a href="#1-关于linux的启动" class="headerlink" title="1. 关于linux的启动"></a>1. 关于linux的启动</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;init是所有进程的顶层</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;init读取/etc/inittab，执行rc.sysinit脚本(注意文件名是不一定的,有些unix甚至会将语句直接写在inittab中)</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;rc.sysinit脚本作了很多工作:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">init <span class="variable">$PATH</span></div><div class="line">config network</div><div class="line">start swap <span class="keyword">function</span></div><div class="line"><span class="built_in">set</span> hostname</div><div class="line">check root file system, repair <span class="keyword">if</span> needed</div><div class="line">check root space</div><div class="line">....</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;rc.sysinit根据inittab执行rc?.d脚本</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;linux是多用户系统，getty是多用户与单用户的分水岭</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在getty之前运行的是系统脚本</p>
<h2 id="2-关于rc-d"><a href="#2-关于rc-d" class="headerlink" title="2. 关于rc.d"></a>2. 关于rc.d</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;所有启动脚本放置在 /etc/rc.d/init.d下</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;rc?.d中放置的是init.d中脚本的链接，命名格式是:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">S&#123;number&#125;&#123;name&#125;</div><div class="line">K&#123;number&#125;&#123;name&#125;</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;S开始的文件向脚本传递start参数</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;K开始的文件向脚本传递stop参数</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;number决定执行的顺序</p>
<h2 id="3-启动脚本示例"><a href="#3-启动脚本示例" class="headerlink" title="3. 启动脚本示例"></a>3. 启动脚本示例</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这是一个用来启动httpd的 /etc/rc.d/init.d/apache 脚本：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="meta">#!/bin/bash</span></div><div class="line">......</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;可以看出他接受start,stop,restart,status参数</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;然后可以这样建立rc?.d的链接：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line"><span class="built_in">cd</span> /etc/rc.d/init.d &amp;&amp;</div><div class="line">ln -sf ../init.d/apache ../rc0.d/K28apache &amp;&amp;</div><div class="line">ln -sf ../init.d/apache ../rc1.d/K28apache &amp;&amp;</div><div class="line">ln -sf ../init.d/apache ../rc2.d/K28apache &amp;&amp;</div><div class="line">ln -sf ../init.d/apache ../rc3.d/S32apache &amp;&amp;</div><div class="line">ln -sf ../init.d/apache ../rc4.d/S32apache &amp;&amp;</div><div class="line">ln -sf ../init.d/apache ../rc5.d/S32apache &amp;&amp;</div><div class="line">ln -sf ../init.d/apache ../rc6.d/K28apache</div></pre></td></tr></table></figure>
<h2 id="4-关于rc-local"><a href="#4-关于rc-local" class="headerlink" title="4. 关于rc.local"></a>4. 关于rc.local</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;经常使用的 rc.local 则完全是习惯问题，不是标准。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;各个发行版有不同的实现方法，可以这样实现：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">touch /etc/rc.d/rc.local</div><div class="line">chmod +x /etc/rc.d/rc.local</div><div class="line">ln -sf /etc/rc.d/rc.local /etc/rc.d/rc1.d/S999rc.local &amp;&amp;</div><div class="line">ln -sf /etc/rc.d/rc.local /etc/rc.d/rc2.d/S999rc.local &amp;&amp;</div><div class="line">ln -sf /etc/rc.d/rc.local /etc/rc.d/rc3.d/S999rc.local &amp;&amp;</div><div class="line">ln -sf /etc/rc.d/rc.local /etc/rc.d/rc4.d/S999rc.local &amp;&amp;</div><div class="line">ln -sf /etc/rc.d/rc.local /etc/rc.d/rc5.d/S999rc.local &amp;&amp;</div><div class="line">ln -sf /etc/rc.d/rc.local /etc/rc.d/rc6.d/S999rc.local</div></pre></td></tr></table></figure>
<h2 id="5-关于bash启动脚本"><a href="#5-关于bash启动脚本" class="headerlink" title="5. 关于bash启动脚本"></a>5. 关于bash启动脚本</h2><ul>
<li>/etc/profile</li>
<li>/etc/bashrc</li>
<li>~/.bash_profile</li>
<li>~/.bashrc</li>
</ul>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;是bash的启动脚本</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;一般用来设置单用户的启动环境，也可以实现开机单用户的程序，但要明确他们都是属于bash范畴而不是系统范畴。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;它们的具体作用介绍如下：</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;/bin/bash这个命令解释程序(后面简称shell)使用了一系列启动文件来建立一个运行环境：</p>
<ul>
<li>/etc/profile</li>
<li>/etc/bashrc</li>
<li>~/.bash_profile</li>
<li>~/.bashrc</li>
<li>~/.bash_logout</li>
</ul>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;每一个文件都有特殊的功用并对登陆和交互环境有不同的影响。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;/etc/profile 和 ~/.bash_profile 是在启动一个交互登陆shell的时候被调用。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;/etc/bashrc 和 ~/.bashrc 是在一个交互的非登陆shell启动的时候被调用。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;~/.bash_logout 在用户注销登陆的时候被读取</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;一个交互的登陆shell会在 /bin/login 成功登陆之后运行。一个交互的非登陆shell是通过命令行来运行的，如[prompt]$/bin/bash。一般一个非交互的shell出现在运行 shell脚本的时候。之所以叫非交互的shell，是因为它不在命令行上等待输入而只是执行脚本程序。</p>
<h2 id="6-关于开机程序的自动启动"><a href="#6-关于开机程序的自动启动" class="headerlink" title="6. 关于开机程序的自动启动"></a>6. 关于开机程序的自动启动</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;系统脚本可以放置在/etc/rc.d/init.d中并建立/etc/rc.d/rc?.d链接，也可以直接放置在/etc/rc.d/rc.local中。</p>
<hr>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;init.d脚本包含完整的start,stop,status,reload等参数，是标准做法，推荐使用。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;为特定用户使用的程序（如有的用户需要使用中文输入法而有的不需要）放置在~/中的bash启动脚本中。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置系统自动启动<br>在/etc/init.d/下创建smsafe文件<br>内容：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line"><span class="meta">#!/bin/bash</span></div><div class="line"><span class="comment"># chkconfig: 35 95 1</span></div><div class="line"><span class="comment"># description: script to start/stop smsafe</span></div><div class="line"><span class="keyword">case</span> 1instart)sh/opt/startsms.sh;;stop)sh/opt/stopsms.sh;;∗)<span class="built_in">echo</span><span class="string">"Usage: 0 (start|stop)"</span></div><div class="line">;;</div><div class="line"><span class="keyword">esac</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;更改权限</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># chmod 775 smsafe</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;加入自动启动</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># chkconfig –add smsafe</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;查看自动启动设置</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># chkconfig –list smsafe</span></div><div class="line">smsafe 0:off 1:off 2:off 3:on 4:off 5:on 6:off</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;以后可以用以下命令启动和停止脚本</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># service smsafe start 启动</span></div><div class="line"><span class="comment"># service smsafe stop 停止</span></div></pre></td></tr></table></figure>
<hr>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;jira 的启动主要依靠的是bin目录下的catalina.sh脚本，提供了如init脚本的start，stop等参数</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line"><span class="meta">#!/bin/bash</span></div><div class="line"><span class="comment">#</span></div><div class="line"><span class="comment"># chkconfig: 2345 85 15</span></div><div class="line"><span class="comment"># description: jira</span></div><div class="line"><span class="comment"># processname: jira</span></div><div class="line"><span class="comment"># source function library</span></div><div class="line">. /etc/init.d/<span class="built_in">functions</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;下面一行比较重要，为jira的安装路径，没有的话，将会提示找不到文件</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div></pre></td><td class="code"><pre><div class="line">CATALINA_HOME=<span class="string">"/var/www/jira"</span></div><div class="line">RETVAL=0</div><div class="line"><span class="function"><span class="title">start</span></span>() &#123;</div><div class="line"><span class="built_in">echo</span> -n $<span class="string">"Starting jira services: "</span></div><div class="line">. /var/www/jira/bin/catalina.sh start</div><div class="line">RETVAL=$?</div><div class="line"><span class="built_in">echo</span></div><div class="line">&#125;</div><div class="line"><span class="function"><span class="title">stop</span></span>() &#123;</div><div class="line"><span class="built_in">echo</span> -n $<span class="string">"Shutting down jira services: "</span></div><div class="line">. /var/www/jira/bin/catalina.sh stop</div><div class="line">RETVAL=$?</div><div class="line"><span class="built_in">echo</span></div><div class="line">&#125;</div><div class="line"><span class="keyword">case</span> <span class="string">"<span class="variable">$1</span>"</span> <span class="keyword">in</span></div><div class="line">start)</div><div class="line">start</div><div class="line">;;</div><div class="line">stop)</div><div class="line">stop</div><div class="line">;;</div><div class="line">restart|reload)</div><div class="line">stop</div><div class="line">start</div><div class="line">;;</div><div class="line">status)</div><div class="line">status jira</div><div class="line">RETVAL=$?</div><div class="line">;;</div><div class="line">*)</div><div class="line"><span class="built_in">echo</span> <span class="string">"Usage: 0 &#123;start|stop|restart|status&#125;"</span></div><div class="line"><span class="built_in">exit</span> 1</div><div class="line"><span class="keyword">esac</span></div><div class="line"><span class="built_in">exit</span> <span class="variable">$RETVAL</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;保存为/etc/init.d/jira<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;然后利用</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">chkconfig --add jira</div><div class="line">OK</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;启动</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">/etc/init.d/jira start</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;停止</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">/etc/init.d/jira stop</div></pre></td></tr></table></figure>
<hr>
<h3 id="以Websphere为例子"><a href="#以Websphere为例子" class="headerlink" title="以Websphere为例子"></a>以Websphere为例子</h3><ol>
<li>在/etc/rc.d/init.d目录下新建启动脚本startWebsphere，键入以下内容：</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="meta">#!/bin/sh</span></div><div class="line">/opt/WebSphere/AppServer/bin/startServer.sh server1</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;修改该文件的权限：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">chmod 755 startWebsphere</div></pre></td></tr></table></figure>
<ol>
<li>在对应的目录下建立软连接(假设系统默认进入X11)</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="built_in">cd</span> /etc/rc.d/rc5.d</div><div class="line">ln -s ../init.d/startWebsphere S99startWebsphere</div></pre></td></tr></table></figure>
<ol>
<li>重启系统即可</li>
</ol>
<hr>
<h3 id="linux下oracle的自启动脚本"><a href="#linux下oracle的自启动脚本" class="headerlink" title="linux下oracle的自启动脚本"></a>linux下oracle的自启动脚本</h3><ol>
<li>写一个StartOracle.sql,假设放在/目录下</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">vi /StartOracle.sql  <span class="comment">##加入如下两行保存</span></div><div class="line">startup</div><div class="line"><span class="built_in">exit</span></div></pre></td></tr></table></figure>
<p>2.配置/etc/rc.local</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">vi /etc/rc.local   <span class="comment">##加入如下内容，保存</span></div><div class="line">su - oracle -c <span class="string">'ORACLE H OME/bin/lsnrctlstart ′ su−oracle−c ′ ORACLE_HOME/bin/sqlplus "/as sysdba" @/StartOracle.sql'</span></div></pre></td></tr></table></figure>
<ol>
<li>如果还要自动启动oracle enterprise manager(em)和isqlplus可以如下配置</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">vi /etc/rc.local     <span class="comment">##加入</span></div><div class="line">su - oracle -c <span class="string">'ORACLE H OME/bin/emctlstartdbconsole ′ su−oracle−c ′ ORACLE_HOME/bin/isqlplusctl start'</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;要知道em和isqlplus等使用的端口可以查询文件：</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;$ORACLE_HOME/install/portlist.ini(以oracle 10.1.0.3为例)</p>
<hr>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/1. Linux 基础/62. Linux系统服务/">Linux系统服务</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Linux/">Linux</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果你对windows非常熟悉的话，相信你肯定配置过开机启动的服务，有些服务我们日常用不到则要把它停掉，一来可以节省资源，二来可以减少安全隐患。在linux上同样也有相关的工具来管理系统的服务。</p>
<h2 id="1-ntsysv服务配置工具"><a href="#1-ntsysv服务配置工具" class="headerlink" title="1. ntsysv服务配置工具"></a>1. ntsysv服务配置工具</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;用来配置哪些服务开启或者关闭，有点类似图形界面，不过是使用键盘来控制的。如果没有这个命令请使用 <code>yum  install  -y  ntsysv</code> 安装它。安装好后，直接运行命令 <code>ntsysv</code> 回车后弹出一个配置界面：</p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/%E7%B3%BB%E7%BB%9F%E6%9C%8D%E5%8A%A1/01.png?raw=true" alt=""></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;按键盘的上下方向键可以调节红色光标，按空格可以选择开启或者不开启，如果前面的中括号内显示有 <code>*</code> 则表示开启否则不开启。通过这个工具也可以看到目前系统中所有的服务。 <strong>建议除 “crond, iptables, network, sshd, syslog, irqbalance, sendmail, microcode_ctl” 外其他服务全部停掉。选择好后，按 “tab” 键选择 “确定”, 然后回车，需要重启机器才能生效</strong> 。</p>
<h2 id="2-chkconfig服务管理工具"><a href="#2-chkconfig服务管理工具" class="headerlink" title="2. chkconfig服务管理工具"></a>2. chkconfig服务管理工具</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Linux系统所有的预设服务可以查看/etc/init.d/目录得到:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># ls /etc/init.d</span></div><div class="line">auditd     keepalived   netfs    portreserve  rpcidmapd   squid</div><div class="line">crond      killall      network  postfix      rpcsvcgssd  sshd</div><div class="line"><span class="built_in">functions</span>  messagebus   nfs      rdisc        rsyslog     sysstat</div><div class="line">halt       mysqld       nfslock  resin        sandbox     tomcat</div><div class="line">ip6tables  mysqldslave  nmb      restorecond  saslauthd   udev-post</div><div class="line">iptables   named        ntpd     rpcbind      single      vsftpd</div><div class="line">ipvsadm    netconsole   ntpdate  rpcgssd      smb         winbind</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;其实这就是系统所有的预设服务了。为什么这样讲，因为系统预设服务都是可以通过这样的命令实现 <code>service  服务名  start|stop|restart</code> 这里的服务名就是/etc/init.d/目录下的这些文件了。除了可以使用 <code>service  crond start</code> 启动crond外，还可以使用 <code>/etc/init.d/crond start</code> 来启动。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;言归正传，我们可以使用 chkconfig –list 列出所有的服务以及每个级别是否开启:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># chkconfig --list</span></div><div class="line">abrt-ccpp 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:启用 6:关闭</div><div class="line">abrtd 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:启用 6:关闭</div><div class="line">acpid 0:关闭 1:关闭 2:启用 3:关闭 4:启用 5:启用 6:关闭</div><div class="line">atd 0:关闭 1:关闭 2:关闭 3:关闭 4:启用 5:启用 6:关闭</div><div class="line">auditd 0:关闭 1:关闭 2:启用 3:关闭 4:启用 5:启用 6:关闭</div><div class="line">blk-availability 0:关闭 1:启用 2:启用 3:关闭 4:启用 5:启用 6:关闭</div><div class="line">cpuspeed 0:关闭 1:启用 2:启用 3:关闭 4:启用 5:启用 6:关闭</div><div class="line">crond 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭</div><div class="line">haldaemon 0:关闭 1:关闭 2:关闭 3:关闭 4:启用 5:启用 6:关闭</div><div class="line">htcacheclean 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭</div><div class="line">httpd 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭</div><div class="line">ip6tables 0:关闭 1:关闭 2:启用 3:关闭 4:启用 5:启用 6:关闭</div><div class="line">iptables 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭</div><div class="line">irqbalance 0:关闭 1:关闭 2:关闭 3:启用 4:启用 5:启用 6:关闭</div><div class="line">kdump 0:关闭 1:关闭 2:关闭 3:关闭 4:启用 5:启用 6:关闭</div><div class="line">lvm2-monitor 0:关闭 1:启用 2:启用 3:关闭 4:启用 5:启用 6:关闭</div><div class="line">mdmonitor 0:关闭 1:关闭 2:启用 3:关闭 4:启用 5:启用 6:关闭</div><div class="line">messagebus 0:关闭 1:关闭 2:启用 3:关闭 4:启用 5:启用 6:关闭</div><div class="line">netconsole 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭</div><div class="line">netfs 0:关闭 1:关闭 2:关闭 3:关闭 4:启用 5:启用 6:关闭</div><div class="line">network 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭</div><div class="line">ntpd 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭</div><div class="line">ntpdate 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭</div><div class="line">postfix 0:关闭 1:关闭 2:启用 3:关闭 4:启用 5:启用 6:关闭</div><div class="line">psacct 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭</div><div class="line">quota_nld 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭</div><div class="line">rdisc 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭</div><div class="line">restorecond 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭</div><div class="line">rngd 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭</div><div class="line">rsyslog 0:关闭 1:关闭 2:启用 3:关闭 4:启用 5:启用 6:关闭</div><div class="line">saslauthd 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭</div><div class="line">smartd 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭</div><div class="line">sshd 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭</div><div class="line">sysstat 0:关闭 1:启用 2:启用 3:启用 4:启用 5:启用 6:关闭</div><div class="line">udev-post 0:关闭 1:启用 2:启用 3:关闭 4:启用 5:启用 6:关闭</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这里的级别（0,1,2,3,4,5,6）就是 /etc/inittab 里面的那几个启动级别了，0、1、6运行级别被系统保留：其中0作为shutdown动作，1作为重启至单用户模式，6为重启；在一般的Linux系统实现中，都使用了2、3、4、5几个级别，在CentOS系统中，2表示无NFS支持的多用户模式，3表示完全多用户模式（也是最常用的级别），4保留给用户自定义，5表示图形登录方式。我们可以使用grep命令把我们想要看的服务过滤出来:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># chkconfig --list |grep cron</span></div><div class="line">crond 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;现在我们只是看到了各服务在每个级别下是否开启，那么如何去更改哪个级别下是否开启呢？</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># chkconfig --level 3 crond off</span></div><div class="line">[root@localhost ~]<span class="comment"># chkconfig --list |grep cron</span></div><div class="line">crond 0:关闭 1:关闭 2:启用 3:关闭 4:启用 5:启用 6:关闭</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;用 –level 指定级别，后面是服务名，然后是 off 或者 on ，–level 后还可以跟多个级别：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># chkconfig --level 345 crond off</span></div><div class="line">[root@localhost ~]<span class="comment"># chkconfig --list |grep cron</span></div><div class="line">crond 0:关闭 1:关闭 2:启用 3:关闭 4:关闭 5:关闭 6:关闭</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;另外还可以省略级别，默认是针对2，3，4，5级别操作：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># chkconfig crond on</span></div><div class="line">[root@localhost ~]<span class="comment"># chkconfig --list |grep cron</span></div><div class="line">crond 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;chkconfig 还有一个功能就是可以把某个服务加入到系统服务，即可以使用 <code>service 服务名 start</code> 这样的形式，并且可以在 <code>chkconfig --list</code> 中查找到。当然也能删除掉。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># chkconfig --del crond</span></div><div class="line">[root@localhost ~]<span class="comment"># chkconfig --list |grep cron</span></div><div class="line">[root@localhost ~]<span class="comment"># chkconfig --add crond</span></div><div class="line">[root@localhost ~]<span class="comment"># chkconfig --list |grep cron</span></div><div class="line">crond 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这个功能常用在把自定义的启动脚本加入到系统服务当中。</p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/1. Linux 基础/61. Linux下使用iptables实现内网的ftp端口映射/">Linux下使用iptables实现内网的ftp端口映射</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Linux/">Linux</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;有两台机器，其中一台A 有内网和外网，B机器只有内网。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;想达到的目的： 通过A机器的外网去访问B机器的ftp（21）</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;环境：<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;A机器外网IP为  123.234.12.22(eth1)  内网IP为 192.168.10.20 (eth0)<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;B机器内网为 192.168.10.21</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;实现方法：</p>
<ol>
<li><p>让你的linux支持ftp的端口转发<br><code>modprobe ip_nat_ftp</code> ,加载ip_nat_ftp模块（若没有编译进内核），以使ftp能被正确NAT<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <code>modprobe ip_conntrack_ftp</code>  ,加载ip_conntrack_ftp模块</p>
</li>
<li><p>在A机器上打开端口转发功能</p>
</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">vi  /etc/sysctl.conf</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;使 net.ipv4.ip_forward = 1</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">sysctl -p</div></pre></td></tr></table></figure>
<ol>
<li>在A机器上创建iptables规则</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">iptables -t nat -I PREROUTING -d 123.234.12.22   -p tcp --dport 21 -j DNAT --to 192.168.10.21:21</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;把访问外网21端口的包转发到内网ftp服务器</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">iptables -t nat -I POSTROUTING -d 192.168.10.21 -p tcp --dport 21 -j SNAT --to 192.168.10.20</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;把到内网ftp服务器的包回源到内网网卡上，不然包只能转到ftp服务器，而返回的包不能到达客户端</p>

	

	

</article>





	<span class="different-posts">📖 <a href="/page/58">more posts</a> 📖</span>



	</main>

	<footer class="footer">
	<div class="footer-content">
		
	      <div class="footer__element">
	<p>Hi there, <br />welcome to my Blog glad you found it. Have a look around, will you?</p>
</div>

	    
	      <div class="footer__element">
	<h5>Check out</h5>
	<ul class="footer-links">
		<li class="footer-links__link"><a href="/archives">Archive</a></li>
		
		  <li class="footer-links__link"><a href="/atom.xml">RSS</a></li>
	    
		<li class="footer-links__link"><a href="/about">about page</a></li>
		<li class="footer-links__link"><a href="/tags">Tags</a></li>
		<li class="footer-links__link"><a href="/categories">Categories</a></li>
	</ul>
</div>

	    

		<div class="footer-credit">
			<span>© 2017 失落的乐章 | Powered by <a href="https://hexo.io/">Hexo</a> | Theme <a href="https://github.com/HoverBaum/meilidu-hexo">MeiliDu</a></span>
		</div>

	</div>


</footer>



</body>

</html>
